H2 Database কাস্টম ডাটাটাইপ এবং কাস্টম ফাংশন তৈরি করার মাধ্যমে ডেটাবেজের কার্যক্ষমতা এবং ফিচারগুলি আরও বিস্তৃত করতে পারে। কাস্টম ডাটাটাইপগুলি বিশেষভাবে এমন ডেটা সংরক্ষণ ও প্রক্রিয়াকরণের জন্য ব্যবহার করা হয়, যেগুলি ডেটাবেজে ইতিমধ্যে বিদ্যমান ডিফল্ট ডাটাটাইপের বাইরে। একইভাবে, কাস্টম ফাংশন তৈরি করে আপনি নিজের নির্দিষ্ট প্রয়োজনীয়তা অনুযায়ী ডেটাবেজের লজিক সম্প্রসারণ করতে পারেন।
এখানে আমরা কাস্টম ডাটাটাইপ এবং কাস্টম ফাংশন তৈরি করার কৌশল এবং তাদের ব্যবহারের উদাহরণ আলোচনা করব।
H2 ডেটাবেজে কাস্টম ডাটাটাইপ তৈরি করার মাধ্যমে আপনি একাধিক কলাম বা টেবিলের জন্য প্রয়োজনীয় নতুন ধরনের ডেটা তৈরি করতে পারেন। H2 ডেটাবেজে আপনি Java Classes এর সাহায্যে কাস্টম ডাটাটাইপ তৈরি করতে পারবেন।
H2 ডেটাবেজে কাস্টম ডাটাটাইপ তৈরি করতে, আপনাকে Java ক্লাস তৈরি করতে হবে এবং সেই ক্লাসটি UserType
ইন্টারফেস ব্যবহার করে ডেটাবেজে রেজিস্টার করতে হবে।
ধরা যাক, আমরা একটি কাস্টম ডাটাটাইপ তৈরি করতে চাই, যেমন UUID
(Universal Unique Identifier):
import org.h2.api.JavaObjectSerializer;
import org.h2.api.UserType;
import java.io.Serializable;
import java.util.UUID;
public class UUIDType implements UserType, Serializable {
@Override
public int getJdbcType() {
return java.sql.Types.VARCHAR;
}
@Override
public String convertToSQL(String value) {
return UUID.fromString(value).toString();
}
@Override
public String convertFromSQL(String value) {
return value;
}
@Override
public boolean isValid(String value) {
try {
UUID.fromString(value);
return true;
} catch (IllegalArgumentException e) {
return false;
}
}
}
এই ক্লাসটি UUID
ডেটা টাইপ তৈরি করবে যা VARCHAR হিসাবে SQL-এ রূপান্তরিত হবে। আপনি convertToSQL এবং convertFromSQL পদ্ধতিগুলি ব্যবহার করে ডেটার রূপান্তর নিয়ন্ত্রণ করতে পারেন।
একবার কাস্টম ডাটাটাইপ Java ক্লাস তৈরি হলে, আপনি H2 ডেটাবেজে এই ডাটাটাইপ রেজিস্টার করতে পারেন:
CREATE ALIAS UUID AS
COMPILE 'com.example.UUIDType';
এটি UUID
নামক কাস্টম ডাটাটাইপ তৈরি করবে এবং আপনার ডেটাবেজের মধ্যে UUID
ডেটা টাইপটি ব্যবহার করা যাবে।
CREATE TABLE users (
id UUID PRIMARY KEY,
name VARCHAR(255)
);
INSERT INTO users (id, name) VALUES ('123e4567-e89b-12d3-a456-426614174000', 'Alice');
এখানে, UUID
কাস্টম ডাটাটাইপ ব্যবহার করে আমরা একটি users
টেবিল তৈরি করেছি এবং সেখানে একটি UUID
রেকর্ড ইনসার্ট করেছি।
H2 ডেটাবেজে কাস্টম ফাংশন তৈরি করার মাধ্যমে আপনি নতুন SQL ফাংশন যুক্ত করতে পারেন, যা আপনার ডেটাবেজের জন্য নতুন কার্যক্ষমতা যোগ করবে।
H2 ডেটাবেজে Java Function ব্যবহার করে কাস্টম ফাংশন তৈরি করা যায়। এটি Java ক্লাসে একটি পদ্ধতি তৈরি করে যা SQL-এর মধ্যে কল করা যাবে।
ধরা যাক, আমরা একটি কাস্টম ফাংশন তৈরি করতে চাই যা দুটি সংখ্যার যোগফল প্রদান করবে:
import org.h2.api.Function;
import org.h2.api.UserFunction;
public class AddFunction implements UserFunction {
@Override
public String getName() {
return "ADD_NUMBERS";
}
@Override
public Object call(Object... args) {
if (args.length == 2) {
double num1 = (Double) args[0];
double num2 = (Double) args[1];
return num1 + num2;
}
return null;
}
}
এটি ADD_NUMBERS
নামক একটি কাস্টম ফাংশন তৈরি করবে যা দুটি সংখ্যা যোগ করবে।
Java ক্লাসটি তৈরি হওয়ার পরে, H2 ডেটাবেজে কাস্টম ফাংশনটি রেজিস্টার করতে হবে:
CREATE ALIAS ADD_NUMBERS AS
COMPILE 'com.example.AddFunction';
এটি ADD_NUMBERS
নামক কাস্টম ফাংশন তৈরি করবে।
SELECT ADD_NUMBERS(5, 10) AS result;
এটি দুটি সংখ্যার যোগফল প্রদর্শন করবে, অর্থাৎ 15
।
H2 ডেটাবেজে আপনি আরও উন্নত কাস্টম ফাংশন তৈরি করতে পারেন, যেমন স্ট্রিং প্রসেসিং, ক্যালকুলেশন, বা কাস্টম টাইম/ডেটা ফাংশন। এছাড়াও, আপনি scalar functions, aggregate functions এবং table functions তৈরি করতে পারেন, যা ডেটাবেজের মধ্যে উন্নত প্রসেসিং সক্ষম করে।
public class MultiplyFunction implements UserFunction {
@Override
public String getName() {
return "MULTIPLY";
}
@Override
public Object call(Object... args) {
if (args.length == 2) {
double num1 = (Double) args[0];
double num2 = (Double) args[1];
return num1 * num2;
}
return null;
}
}
এই ফাংশনটি দুটি সংখ্যার গুণফল প্রদান করবে।
Table Functions আপনাকে কাস্টম টেবিল তৈরি করার সুযোগ দেয়:
public class GenerateRangeFunction implements UserFunction {
@Override
public String getName() {
return "GENERATE_RANGE";
}
@Override
public Object call(Object... args) {
// Custom logic to return a range of values
return new Object[]{1, 2, 3, 4, 5}; // Simple range from 1 to 5
}
}
এটি একটি কাস্টম টেবিল তৈরি করবে যেটিতে ১ থেকে ৫ পর্যন্ত মান থাকবে।
H2 ডেটাবেজে কাস্টম ডাটাটাইপ এবং কাস্টম ফাংশন তৈরি করা ডেটাবেজের কার্যক্ষমতা এবং লজিককে আরও বিস্তৃত এবং উন্নত করতে সাহায্য করে। আপনি Java ক্লাস ব্যবহার করে কাস্টম ডাটাটাইপ এবং ফাংশন তৈরি করতে পারেন, যা H2 ডেটাবেজের মধ্যে নতুন ধরনের ডেটা প্রসেসিং এবং কাস্টমাইজড লজিক যোগ করে। H2 এর এই ক্ষমতা ডেভেলপারদের জন্য খুবই উপকারী, কারণ এটি তাদের ডেটাবেজের উপযোগিতা এবং পারফরম্যান্স বৃদ্ধি করতে সহায়ক।
কাস্টম ডাটাটাইপ তৈরি করার প্রক্রিয়া এমন একটি ডাটাটাইপ তৈরি করা যা ডেটাবেসে ব্যবহারকারীর প্রয়োজন অনুযায়ী কাস্টম বৈশিষ্ট্য সহ থাকে। এটি সাধারণত Java প্রোগ্রামিং বা SQL ডেটাবেস ব্যবহারের ক্ষেত্রে করা হয়, যেখানে আপনি ডাটাবেসে সংরক্ষিত তথ্যের জন্য নতুন ধরনের ডেটা তৈরি করতে চান। কাস্টম ডাটাটাইপ ডেটাবেসে নতুন বৈশিষ্ট্য যুক্ত করতে, তথ্যের ফর্ম্যাট কাস্টমাইজ করতে এবং সিস্টেমের পারফরম্যান্স বা ব্যবহারিক কাজের জন্য আরও বেশি উপযোগী করে তোলে।
Hibernate ORM ব্যবহার করার সময় আপনি custom data type তৈরি করতে পারেন যাতে কিছু প্রক্রিয়া বা নিয়ম অনুসারে ডেটা সংরক্ষণ করা যায়। সাধারণত Hibernate-এ @Type
অ্যানোটেশন ব্যবহার করে কাস্টম ডাটাটাইপ তৈরি করা হয়।
এখানে আমরা Hibernate এবং Java ক্লাসের মাধ্যমে কাস্টম ডাটাটাইপ তৈরি করার উদাহরণ দেখবো।
ধরা যাক, আপনি একটি CustomDate ক্লাস তৈরি করতে চান, যা Java Date
এবং ডেটাবেসের মধ্যে সংরক্ষণ করতে কাস্টম ফরম্যাটে থাকবে।
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CustomDate implements Serializable {
private Date date;
public CustomDate(Date date) {
this.date = date;
}
public String toString() {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
return sdf.format(date);
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
এই CustomDate ক্লাসটি Date
অবজেক্টকে কাস্টম ফরম্যাটে (যেমন dd-MM-yyyy
) রূপান্তরিত করে একটি স্ট্রিং হিসেবে প্রদান করবে।
এখন আপনাকে Hibernate-এর জন্য একটি কাস্টম টাইপ ক্লাস তৈরি করতে হবে যা CustomDate
টাইপকে সঠিকভাবে হ্যান্ডেল করবে।
import org.hibernate.type.AbstractSingleColumnStandardBasicType;
import org.hibernate.type.descriptor.sql.SqlTypeDescriptor;
import org.hibernate.type.descriptor.sql.VarcharTypeDescriptor;
public class CustomDateType extends AbstractSingleColumnStandardBasicType<CustomDate> {
public static final CustomDateType INSTANCE = new CustomDateType();
public CustomDateType() {
super(VarcharTypeDescriptor.INSTANCE, CustomDateTypeDescriptor.INSTANCE);
}
@Override
public String getName() {
return "customDate";
}
}
এখানে:
CustomDate
টাইপকে সঠিকভাবে স্টোর এবং রিট্রিভ করার জন্য VarcharTypeDescriptor
এবং CustomDateTypeDescriptor
ব্যবহার করে।CustomDateTypeDescriptor.INSTANCE
ব্যবহার করে CustomDate টাইপের সঠিক মান সংরক্ষণ এবং পুনরুদ্ধার করার জন্য কাস্টম লজিক তৈরি করা যায়।এখন আপনার Hibernate Entity ক্লাসে এই কাস্টম টাইপটি ব্যবহার করতে হবে। এই জন্য @Type অ্যানোটেশন ব্যবহার করতে হবে।
import org.hibernate.annotations.Type;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class User {
@Id
private int id;
private String name;
@Type(type = "customDate")
private CustomDate dateOfBirth;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public CustomDate getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(CustomDate dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
}
এখানে:
CustomDate
টাইপকে Hibernate Entity-এ যুক্ত করেছি।Hibernate কনফিগারেশন ফাইলে আপনাকে কাস্টম টাইপটি রেজিস্টার করতে হবে।
<hibernate-configuration>
<session-factory>
<!-- Other Hibernate properties -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:~/test;AUTO_SERVER=TRUE</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<!-- Register custom Hibernate type -->
<mapping class="com.example.User"/>
</session-factory>
</hibernate-configuration>
এখন আপনার User ক্লাসে CustomDate
টাইপটি ব্যবহার করতে পারবেন, এবং এটি Hibernate স্বয়ংক্রিয়ভাবে ডেটাবেসে custom format হিসেবে সংরক্ষণ করবে।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import java.util.Date;
public class Main {
public static void main(String[] args) {
// Hibernate session initialization
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(User.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Create a User object
User user = new User();
user.setId(1);
user.setName("John Doe");
user.setDateOfBirth(new CustomDate(new Date()));
// Start a transaction
session.beginTransaction();
// Save the User object
session.save(user);
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
এখন CustomDate টাইপটি Hibernate দ্বারা ডেটাবেসে সঠিক ফরম্যাটে সংরক্ষণ হবে। CustomDate এর toString()
মেথড অনুযায়ী ডেটা স্ট্রিং ফরম্যাটে ডেটাবেসে ইনসার্ট হবে।
Hibernate এর সাথে কাস্টম ডাটাটাইপ তৈরি করা একটি শক্তিশালী এবং কার্যকরী প্রক্রিয়া, যা আপনাকে Java ক্লাসে নির্দিষ্ট ধরনের ডেটা সংরক্ষণ এবং প্রক্রিয়া করতে সহায়ক করে। কাস্টম ডাটাটাইপ তৈরি করতে আপনাকে:
এই প্রক্রিয়া আপনাকে ডেটাবেসের কাঠামোতে কাস্টম ডেটা ফরম্যাট সংরক্ষণ করার সুযোগ দেয় এবং উন্নত কার্যক্ষমতা প্রদান করে।
H2 Database একটি লাইটওয়েট SQL ডেটাবেজ যা ব্যবহারকারীদের কাস্টম ফাংশন তৈরি এবং তাদের কার্যকরী করতে সাহায্য করে। SQL ফাংশনগুলি সাধারণত একটি নির্দিষ্ট কাজ বা ক্যালকুলেশন সম্পাদন করার জন্য ব্যবহৃত হয়। কাস্টম ফাংশন তৈরি করার মাধ্যমে আপনি ডেটাবেজে নির্দিষ্ট ধরনের ডেটা প্রক্রিয়াকরণ বা ক্যালকুলেশন করতে পারেন যা পূর্বনির্ধারিত SQL ফাংশন দিয়ে সম্ভব নয়।
এই টিউটোরিয়ালে, আমরা দেখব কীভাবে H2 ডেটাবেজে কাস্টম ফাংশন তৈরি এবং ব্যবহার করা যায়।
H2 Database-এ কাস্টম ফাংশন তৈরি করার জন্য CREATE FUNCTION
কমান্ড ব্যবহার করা হয়। আপনি একটি ইউজার-ডিফাইন্ড ফাংশন (UDF) তৈরি করতে পারেন, যা কোনো নির্দিষ্ট কাজ বা হিসাব করতে সহায়ক হয়।
এখানে একটি উদাহরণ দেওয়া হল যেখানে একটি কাস্টম ফাংশন তৈরি করা হয়েছে যা দুটি সংখ্যার যোগফল রিটার্ন করে:
CREATE FUNCTION ADD_NUMBERS(a INT, b INT)
RETURNS INT
LANGUAGE JAVA
AS
;
এই ফাংশনে:
এটি একটি সিম্পল ফাংশন যা দুটি পূর্ণসংখ্যা ইনপুট নিয়ে তাদের যোগফল প্রদান করবে।
এখন যে ফাংশনটি তৈরি করা হলো তা SQL কুয়েরিতে ব্যবহার করা যেতে পারে:
SELECT ADD_NUMBERS(10, 20);
এটি রিটার্ন করবে:
30
ফাংশনটি দুটি সংখ্যার যোগফল প্রদান করবে, যেমন এখানে 10 এবং 20 এর যোগফল।
আপনি কাস্টম ফাংশনে কন্ডিশনাল লজিকও ব্যবহার করতে পারেন, যেমন IF
স্টেটমেন্ট।
CREATE FUNCTION MULTIPLY_IF_GREATER(a INT, b INT)
RETURNS INT
LANGUAGE JAVA
AS
;
এই ফাংশনে:
SELECT MULTIPLY_IF_GREATER(10, 5); -- রিটার্ন করবে 50 (গুণফল)
SELECT MULTIPLY_IF_GREATER(5, 10); -- রিটার্ন করবে 15 (যোগফল)
আপনি ফাংশনে একাধিক প্যারামিটারও ব্যবহার করতে পারেন, যেমন একটি ফাংশন যা দুটি সংখ্যার গুণফল এবং যোগফল রিটার্ন করবে:
CREATE FUNCTION ADD_AND_MULTIPLY(a INT, b INT, c INT)
RETURNS VARCHAR
LANGUAGE JAVA
AS
;
এই ফাংশনটি:
SELECT ADD_AND_MULTIPLY(10, 20, 5);
এটি রিটার্ন করবে:
Sum: 30, Product: 100
common.read_more